home *** CD-ROM | disk | FTP | other *** search
/ Logiciels PC Special 3 / Logiciel PC - Hors-Serie 3.iso / Logs / micros / ql / outils / qltoolsq / source / msdos / qdc.c < prev   
C/C++ Source or Header  |  1996-07-14  |  3KB  |  142 lines

  1. #if defined  (__NT__) || defined (__OS2__)
  2. # define __MSDOS__
  3. #endif
  4.  
  5. #if defined  (__MSDOS__)
  6. # ifndef MSDOS
  7. #  define MSDOS
  8. # endif
  9. #endif
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <malloc.h>
  14. #include <time.h>
  15. #include <fcntl.h>
  16. #include <string.h>
  17. #include <ctype.h>
  18.  
  19. #include <bios.h>
  20. #include <dos.h>        /* for delay    */
  21. #include <io.h>            /* for setmode  */
  22. #include <conio.h>
  23.  
  24. static unsigned int drive;
  25.  
  26. #ifdef __WATCOMC__
  27. typedef unsigned short ushort;
  28.  
  29. ushort biosdisk (ushort service, ushort drive, ushort side, ushort track,
  30.          ushort sector, ushort nsector, void *buffer)
  31. {
  32.     struct diskinfo_t di;
  33.     ushort status;
  34.  
  35.     di.drive = drive;
  36.     di.head = side;
  37.     di.track = track;
  38.     di.sector = sector;
  39.     di.nsectors = nsector;
  40.     di.buffer = buffer;
  41.     status = _bios_disk (service, &di);
  42.     return status;
  43. }
  44. #endif
  45. void usage(void)
  46. {
  47.     fputs("qdc in out\n", stderr);
  48.     exit(0);
  49. }
  50.  
  51. int main(int ac, char **av)
  52. {
  53.     short act;
  54.     short err;
  55.     int fd, mode;
  56.     char *fn;
  57.     struct diskinfo_t di;
  58.     int nbuf;
  59.     unsigned char *buf;
  60.  
  61.     if(ac >= 3)
  62.     {
  63.         if(*(*(av+1)+1) == ':')
  64.         {
  65.             di.drive = toupper(**(av+1)) - 'A';
  66.             mode = O_CREAT|O_TRUNC|O_WRONLY;
  67.             fn = *(av+2);
  68.             act = _DISK_READ;
  69.         }
  70.         else if(*(*(av+2)+1) == ':')
  71.         {
  72.             di.drive = toupper(**(av+2)) - 'A';
  73.             mode = O_RDONLY;
  74.             fn = *(av+1);
  75.             act = _DISK_WRITE;
  76.         }
  77.         else
  78.         {
  79.             usage();
  80.         }
  81.         if(ac == 4 && tolower(**(av+3) != 'd'))
  82.         {
  83.             di.nsectors = 18;
  84.         }
  85.         else
  86.         {
  87.             di.nsectors = 9;
  88.         }
  89.  
  90.         if((buf = malloc(nbuf = 512*di.nsectors)))
  91.         {
  92.             mode |= O_BINARY;
  93.             fd = open(fn, mode, 0666);
  94.             if(fd > 0)
  95.             {
  96.                 di.buffer = buf;
  97.                 di.sector = 1;
  98.                 err  = _bios_disk (_DISK_RESET, &di);
  99.                 delay(100);
  100.                 err  = _bios_disk (_DISK_RESET, &di);
  101.                 for (di.track = 0; err == 0 && di.track < 80; di.track++)
  102.                 {
  103.                     for(di.head = 0; err == 0 && di.head < 2; di.head++)
  104.                     {
  105.                         printf("Side %d, track %2d\r", di.head, di.track);
  106.                         fflush(stdout);
  107.                         if(act == _DISK_WRITE)
  108.                         {
  109.                             err = (0 > read(fd, buf, nbuf));
  110.                         }
  111.                         if(err == 0)
  112.                         {
  113.                             err = 0xff00 & _bios_disk (act, &di);
  114.                         if (err)
  115.                             {
  116.                             printf ("read block: %d %d %d %d\n",
  117.                                     di.head, di.track, di.sector, err);
  118.                             }
  119.                             if(act == _DISK_READ && !err)
  120.                             {
  121.                                 err = 0 > write(fd, buf, nbuf);
  122.                             }
  123.                         }
  124.                     }
  125.             }
  126.                 close(fd);
  127.                 putc('\n', stdout);
  128.             }
  129.             else
  130.             {
  131.                 perror("open:");
  132.             }
  133.         }
  134.     }
  135.     else
  136.     {
  137.         usage();
  138.     }
  139.     return 0;
  140. }
  141.  
  142.